using Newtonsoft.Json;
using StardewModdingAPI.Toolkit.Framework.Clients.CompatibilityRepo;

namespace StardewModdingAPI.Web.ViewModels;

/// <summary>Metadata about a mod's compatibility with the latest versions of SMAPI and Stardew Valley.</summary>
public class ModCompatibilityModel
{
    /*********
    ** Accessors
    *********/
    /// <summary>The compatibility status, as a string like <c>"Broken"</c>.</summary>
    public string Status { get; }

    /// <summary>The human-readable summary, as an HTML block.</summary>
    public string? Summary { get; }

    /// <summary>The game or SMAPI version which broke this mod (if applicable).</summary>
    public string? BrokeIn { get; }

    /// <summary>A link to the unofficial version which fixes compatibility, if any.</summary>
    public ModLinkModel? UnofficialVersion { get; }


    /*********
    ** Public methods
    *********/
    /// <summary>Construct an instance.</summary>
    /// <param name="status">The compatibility status, as a string like <c>"Broken"</c>.</param>
    /// <param name="summary">The human-readable summary, as an HTML block.</param>
    /// <param name="brokeIn">The game or SMAPI version which broke this mod (if applicable).</param>
    /// <param name="unofficialVersion">A link to the unofficial version which fixes compatibility, if any.</param>
    [JsonConstructor]
    public ModCompatibilityModel(string status, string? summary, string? brokeIn, ModLinkModel? unofficialVersion)
    {
        this.Status = status;
        this.Summary = summary;
        this.BrokeIn = brokeIn;
        this.UnofficialVersion = unofficialVersion;
    }

    /// <summary>Construct an instance.</summary>
    /// <param name="info">The mod metadata.</param>
    public ModCompatibilityModel(ModCompatibilityInfo info)
    {
        this.Status = info.Status.ToString();
        this.Status = this.Status.Substring(0, 1).ToLower() + this.Status.Substring(1);

        this.Summary = info.HtmlSummary ?? info.Summary;
        this.BrokeIn = info.BrokeIn;
        if (info.UnofficialVersion != null)
            this.UnofficialVersion = new ModLinkModel(info.UnofficialUrl!, info.UnofficialVersion.ToString());
    }
}
